home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / dev / m2 / GenModula1_14.lha / GTB-Modula / Modules / NewArgSupport.mod < prev    next >
Encoding:
Modula Implementation  |  1993-10-18  |  6.5 KB  |  310 lines

  1. IMPLEMENTATION MODULE NewArgSupport;
  2.  
  3. (*
  4.  * -------------------------------------------------------------------------
  5.  *
  6.  *    :Module.    NewArgSupport
  7.  *    :Contents.    Support module to get arguments transparent from CLI or Workbench
  8.  
  9.  *    :Author.    Reiner Nix
  10.  *    :Address.    Geranienhof 2, 5000 Köln 71 Seeberg
  11.  *    :Address.    rbnix@pool.informatik.rwth-aachen.de
  12.  *    :Copyright.    Public Domain
  13.  *    :Language.    Modula-2
  14.  *    :Translator.    M2Amiga A-L V4.2d
  15.  *    :History.    V1.0    08.08.92 ArgSupport
  16.  *    :History    V1.0    03.04.93 NewArgSupport now getting cli-args by ReadArg
  17.  *
  18.  * -------------------------------------------------------------------------
  19.  *)
  20.  
  21. FROM    SYSTEM            IMPORT    ADR;
  22. FROM    Arts            IMPORT    wbStarted,
  23.                     dosCmdBuf, dosCmdLen,
  24.                     programName,
  25.                     Assert, BreakPoint, Exit;
  26. FROM    Conversions        IMPORT    StrToVal;
  27. FROM    Arguments        IMPORT    NumArgs, GetArg;
  28. FROM    String            IMPORT    Length, Compare, ComparePart,
  29.                     ANSICapString,
  30.                     Copy, CopyPart,
  31.                     Concat, ConcatChar;
  32. FROM    DosD            IMPORT    maxTemplateItems,
  33.                     RDArgsPtr;
  34. FROM    DosL            IMPORT    ReadArgs, FreeArgs,
  35.                     AllocDosObject, FreeDosObject,
  36.                     FindArg,
  37.                     FPuts,
  38.                     Output;
  39. FROM    WorkbenchD        IMPORT    WBObjectType,
  40.                     DiskObjectPtr;
  41. FROM    IconL            IMPORT    GetDiskObject, FreeDiskObject,
  42.                     FindToolType, MatchToolValue;
  43. FROM    Memory            IMPORT    Allocate, Deallocate;
  44.  
  45.  
  46. CONST    CaseEqual        =FALSE;
  47.     maxTemplate        =1024;
  48.     dosRDArgs        =5;    (* fehlt noch in DosD.def *)
  49.  
  50.  
  51. VAR    Programmicon        :DiskObjectPtr;
  52.     ArgTemplate,
  53.     Arguments        :ARRAY [0..maxTemplate] OF CHAR;
  54.     ArgArray        :ARRAY [0..maxTemplateItems] OF LONGINT;
  55.     MyRDArguments,
  56.     RDArguments        :RDArgsPtr;
  57.     ShowInfo        :InfoProcedure;
  58.  
  59.  
  60. (*
  61.  * --- private Funktionen -------------------------------------------------------
  62.  *)
  63.  
  64. PROCEDURE GetIcon;
  65.  
  66. VAR    Laenge            :INTEGER;
  67.     Iconname        :Str;
  68.  
  69.  
  70. BEGIN
  71. GetArg (0, Iconname, Laenge);
  72. Programmicon := GetDiskObject (ADR (Iconname))
  73. END GetIcon;
  74.  
  75.  
  76. PROCEDURE StandardInfo ();
  77.  
  78. VAR    dummy    :BOOLEAN;
  79.  
  80. BEGIN
  81. IF Output () # NIL THEN
  82.   dummy := FPuts (Output (), programName);
  83.   dummy := FPuts (Output (), ADR (": "));
  84.   dummy := FPuts (Output (), ADR (ArgTemplate));
  85.   dummy := FPuts (Output (), ADR ("\nGefordertes Argument fehlt.\n"));
  86.   END
  87. END StandardInfo;
  88.  
  89.  
  90. (*
  91.  * --- öffentliche Funktionen ---------------------------------------------------
  92.  *)
  93.  
  94. PROCEDURE SetArgumentInfo    (    ArgumentInfo    :InfoProcedure);
  95.  
  96. BEGIN
  97. ShowInfo := ArgumentInfo
  98. END SetArgumentInfo;
  99.  
  100.  
  101. PROCEDURE UseArguments        (    Template        :ARRAY OF CHAR);
  102.  
  103. VAR    i    :CARDINAL;
  104.  
  105. BEGIN
  106. IF NOT (wbStarted) THEN
  107.   Copy (ArgTemplate, Template);
  108.  
  109.   FOR i := 0 TO maxTemplateItems-1 DO
  110.     ArgArray[i] := 0
  111.     END;
  112.  
  113.  
  114.   MyRDArguments := AllocDosObject (dosRDArgs, NIL);
  115.   Assert (MyRDArguments # NIL, ADR ("Argumentstruktur nicht anzulegen."));
  116.  
  117.   Copy (Arguments, StrPtr (dosCmdBuf)^);
  118.  
  119.   WITH MyRDArguments^.source DO
  120.     buffer := ADR (Arguments);
  121.     length := Length (Arguments)
  122.     END;
  123.  
  124.  
  125.   RDArguments := ReadArgs (ADR (ArgTemplate), ADR (ArgArray), NIL (*MyRDArguments*));
  126.  
  127.   IF RDArguments = NIL THEN
  128.     ShowInfo ();                    (* Prozedurvariable        *)
  129.     Exit (10)
  130.     END
  131.  
  132.   END
  133. END UseArguments;
  134.  
  135.  
  136. PROCEDURE ArgString        (    Keyword,
  137.                      Default        :ARRAY OF CHAR;
  138.                  VAR Value        :ARRAY OF CHAR);
  139.  
  140. VAR    i        :LONGINT;
  141.     ToolType    :StrPtr;
  142.     Name        :Str;
  143.  
  144. BEGIN
  145. Copy (Name, Keyword);
  146. ANSICapString (Name);
  147.  
  148. IF wbStarted THEN
  149.   IF Programmicon = NIL THEN
  150.     Copy (Value, Default);
  151.     RETURN
  152.     END;
  153.  
  154.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Name));
  155.   IF ToolType = NIL THEN
  156.     Copy (Value, Default);
  157.     RETURN
  158.   ELSE
  159.     Copy (Value, ToolType^);
  160.     RETURN
  161.     END
  162.  
  163. ELSE (* NOT wbStarted *)
  164.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  165.   Assert (i # -1, ADR ("ArgString: das Schlüsselwort fehlt in der Schablone."));
  166.  
  167.   IF StrPtr (ArgArray[i]) # NIL THEN
  168.     Copy (Value, StrPtr (ArgArray[i])^)
  169.   ELSE
  170.     Copy (Value, Default)
  171.     END;
  172.   RETURN
  173.   END
  174. END ArgString;
  175.  
  176.  
  177. PROCEDURE ArgInt        (    Keyword        :ARRAY OF CHAR;
  178.                      Default        :INTEGER) :INTEGER;
  179.  
  180.  
  181. TYPE    NumPtr        =POINTER TO LONGINT;
  182.  
  183. VAR    Negativ, Error    :BOOLEAN;
  184.     Number, i    :LONGINT;
  185.     Value        :Str;
  186.     ToolType    :StrPtr;
  187.  
  188. BEGIN
  189. ANSICapString (Keyword);
  190.  
  191. IF wbStarted THEN
  192.   IF Programmicon = NIL THEN
  193.     RETURN Default
  194.     END;
  195.  
  196.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Keyword));
  197.   IF ToolType = NIL THEN
  198.     RETURN Default
  199.   ELSE
  200.     Copy (Value, ToolType^)
  201.     END;
  202.   StrToVal (Value, Number, Negativ, 10, Error);
  203.   IF NOT (Error) & (MIN (INTEGER) <= Number) & (Number <= MAX (INTEGER)) THEN
  204.     RETURN Number
  205.   ELSE
  206.     RETURN Default
  207.     END
  208.  
  209. ELSE (* NOT wbStarted *)
  210.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  211.   Assert (i # -1, ADR ("ArgInt: das Schlüsselwort fehlt in der Schablone."));
  212.  
  213.   IF (NumPtr (ArgArray[i]) # NIL) &
  214.      (MIN (INTEGER) <= NumPtr (ArgArray[i])^) & (NumPtr (ArgArray[i])^ <= MAX (INTEGER)) THEN
  215.     RETURN NumPtr (ArgArray[i])^
  216.   ELSE
  217.     RETURN Default
  218.     END
  219.   END
  220. END ArgInt;
  221.  
  222.  
  223. PROCEDURE ArgBoolean        (    Keyword        :ARRAY OF CHAR;
  224.                      Default        :BOOLEAN) :BOOLEAN;
  225.  
  226. VAR    i        :LONGINT;
  227.     Value        :Str;
  228.     ToolType    :StrPtr;
  229.  
  230. BEGIN
  231. ANSICapString (Keyword);
  232.  
  233. IF wbStarted THEN
  234.   IF Programmicon = NIL THEN
  235.     RETURN Default
  236.     END;
  237.  
  238.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Keyword));
  239.   IF ToolType = NIL THEN
  240.     RETURN Default
  241.     END;
  242.  
  243.   IF    MatchToolValue (ToolType, ADR ("yes")) OR
  244.         MatchToolValue (ToolType, ADR ("YES")) OR
  245.         MatchToolValue (ToolType, ADR ("Yes")) THEN
  246.     RETURN TRUE
  247.   ELSIF MatchToolValue (ToolType, ADR ("no")) OR
  248.         MatchToolValue (ToolType, ADR ("NO")) OR
  249.         MatchToolValue (ToolType, ADR ("No")) THEN
  250.     RETURN FALSE
  251.   ELSE
  252.     RETURN Default
  253.     END
  254.  
  255. ELSE (* NOT wbStarted *)
  256.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  257.   Assert (i # -1, ADR ("ArgBoolean: das Schlüsselwort fehlt in der Schablone."));
  258.  
  259.   RETURN (ArgArray[i] # 0)
  260.   END
  261. END ArgBoolean;
  262.  
  263.  
  264. PROCEDURE ArgMultiple        (    Keyword        :ARRAY OF CHAR) :StrArrayPtr;
  265.  
  266.  
  267. VAR    i        :LONGINT;
  268.  
  269. BEGIN
  270. IF wbStarted THEN
  271.   RETURN NIL
  272.  
  273. ELSE
  274.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  275.   Assert (i # -1, ADR ("ArgMultiple: das Schlüsselwort fehlt in der Schablone."));
  276.  
  277.   RETURN StrArrayPtr (ArgArray[i])
  278.   END
  279. END ArgMultiple;
  280.  
  281.  
  282. (* NewArgSupport *)
  283. BEGIN
  284. Programmicon := NIL;
  285. RDArguments := NIL;
  286. MyRDArguments := NIL;
  287. ShowInfo := StandardInfo;
  288.  
  289. IF wbStarted THEN
  290.   GetIcon
  291.   END;
  292.  
  293.  
  294. CLOSE
  295. IF Programmicon # NIL THEN
  296.   FreeDiskObject (Programmicon);
  297.   Programmicon := NIL
  298.   END;
  299.  
  300. IF RDArguments # NIL THEN
  301.   FreeArgs (RDArguments);
  302.   RDArguments := NIL;
  303.   END;
  304.  
  305. IF MyRDArguments # NIL THEN
  306.   FreeDosObject (dosRDArgs, MyRDArguments);
  307.   MyRDArguments := NIL
  308.   END
  309. END NewArgSupport.
  310.